package com.hedl.practice.diyJava.encryptionandsecurity.hash_algorithm.test;

import org.apache.commons.lang3.StringUtils;
import org.springframework.util.DigestUtils;

import java.io.UnsupportedEncodingException;
import java.math.BigInteger;
import java.nio.charset.StandardCharsets;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;

public class Main {
    public static void main(String[] args) throws NoSuchAlgorithmException, UnsupportedEncodingException {
        System.out.println("hello".hashCode());     //99162322
        System.out.println("hello,java".hashCode());        //-1594011972
        System.out.println("hello,java".hashCode());
        System.out.println("hello,bob".hashCode());     //1195498971

        System.out.println("===================哈希碰撞==================");
        //这里产生了哈希碰撞
        System.out.println("AaAaAa".hashCode());        //1952508096
        System.out.println("BBAaBB".hashCode());        //1952508096


        System.out.println("======================md5=======================");
        /**
         * Java标准库提供了常用的哈希算法，并且有一套统一的接口。我们以MD5算法为例，看看如何对输入计算哈希
         */
        //创建一个MessageDigest实例:
        MessageDigest md = MessageDigest.getInstance("MD5");
        //反复调用update输入数据:
        md.update("hello".getBytes("UTF-8"));
        md.update("world".getBytes(StandardCharsets.UTF_8));
        byte[] result = md.digest();
        //BigInteger(整数,数组).toString(进制)
        System.out.println(new BigInteger(1,result).toString(16));      //fc5e038d38a57032085441e7fe7010b0

        //这个和上面是一样的加密结果，都是：fc5e038d38a57032085441e7fe7010b0
        byte[] bytes = DigestUtils.md5Digest("helloworld".getBytes(StandardCharsets.UTF_8));
        System.out.println(new BigInteger(1, bytes).toString(16));

        System.out.println("=================SHA-1===========================");
        /**
         * SHA-1也是一种哈希算法，它的输出是160 bits，即20字节。
         * SHA-1是由美国国家安全局开发的，SHA算法实际上是一个系列，包括SHA-0（已废弃）、SHA-1、SHA-256、SHA-512等。
         * 计算SHA-256，我们需要传入名称"SHA-256"，计算SHA-512，我们需要传入名称"SHA-512"
         */
        //这里使用SHA-1和MD5是一样的
        MessageDigest sha_1 = MessageDigest.getInstance("SHA-1");
        sha_1.update("hello".getBytes(StandardCharsets.UTF_8));
        sha_1.update("world".getBytes(StandardCharsets.UTF_8));
        byte[] digest = sha_1.digest();
        System.out.println(new BigInteger(1,digest).toString(16));

        /**
         * 小结：
         *      哈希算法可用于验证数据完整性，具有防篡改检测的功能；
         *      常用的哈希算法有MD5、SHA-1等；
         *      用哈希存储口令时要考虑彩虹表攻击。
         */
    }
}
